Neprerusena ciselna rada pro doklady v FB/IB

Otázka od: aldik@quick.cz

23. 9. 2002 20:25

Nazdar kluci, jak na %subj% fci MAX samozrejme
znam....chci se ale zeptat na
rozumne reseni z hlediska duplicity zaznamu, jake
je riziko, kdyz pouziju
Gen_ID tak to je preci jen jina vec,mam dojem ze
max mohu pouzivat jen po
commit ze? Jake jsou dalsi rizika??


Dekuji moc za kazdou radu...

Ales Pavel
D6 Ent WXP
laik v profesionalnim kolotoci

Odpovedá: Kalhous Zdenek

24. 9. 2002 6:28

On 23 Sep 2002 at 20:51, aldik@quick.cz wrote:
> Nazdar kluci, jak na %subj% fci MAX samozrejme
> znam....chci se ale zeptat na
> max mohu pouzivat jen po
> commit ze? Jake jsou dalsi rizika??
Pridelovani unikatnich cisel v neprerusene rade neni tak trivialni jak
se na prvni pohled zda, riziko pouzivani max pro tento ucel je krome
jineho v tom, ze ve viceuzivatelskem a trochu intenzivnim provozu
ma prakticky nulovou sanci na fungovani. Zkuste si jen tak na papire
nasimulovat jak se to bude chovat.

Odpovedá: ing. Jan Fiala

24. 9. 2002 6:39

Chce to třeba samostatnou tabulku, kde jsou cisla.
V ramci transakce pri zapisu dokladu pridelis cislo, navysis jej v
tabulce a commitnes cely zapis dokladu.
Je treba dbat na spravnou uroven transakce.

V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
tak pouze informativne.

--
Jan Fiala
mailto:jan.fiala@iol.cz

24.9.2002 Kalhous Zdenek:
> On 23 Sep 2002 at 20:51, aldik@quick.cz wrote:
>> Nazdar kluci, jak na %subj% fci MAX samozrejme
>> znam....chci se ale zeptat na
>> max mohu pouzivat jen po
>> commit ze? Jake jsou dalsi rizika??

Odpovedá: Jan Sebelík

24. 9. 2002 11:17

> On 23 Sep 2002 at 20:51, aldik@quick.cz wrote:
> > Nazdar kluci, jak na %subj% fci MAX samozrejme
> > znam....chci se ale zeptat na
> > max mohu pouzivat jen po
> > commit ze? Jake jsou dalsi rizika??

> Odesílatel: Kalhous Zdenek <zdenek.kalhous@comarr.cz>
> Pridelovani unikatnich cisel v neprerusene rade neni tak trivialni jak
> se na prvni pohled zda, riziko pouzivani max pro tento ucel je krome
> jineho v tom, ze ve viceuzivatelskem a trochu intenzivnim provozu
> ma prakticky nulovou sanci na fungovani.
[Honza]
No prave...

Zkusme se zamyslet nad timto resenim:
create table faktura(
  id integer not null,
  cislofaktury integer not null unique,
  status smallint,
  primary key (id)
);

Before insert nastavim id=gen_id(g_id).
Nemam zarucenou souvislou radu.
Faktury mohu dokonce mazat.
V urcitem okamziku je faktura uz hotova.
Nastavim status=1.
Before update if (old.status=0 and new.status=1)
a vsechno je odkontrolovano a je to spravne
nastavim cislofaktury=gen_id(g_cf ).
Kdyz je cislofaktury not null, fakturu uz nesmim menit ani mazat.

Muze se stat, ze nebude cislo faktury souvisla rada?
Pouze tehdy, kdyz before update zavolam g_cf, ale update pritom z nejakych
duvodu selze.
Protoze menim pouze cislo faktury, nehrozi mi selhani update z duvodu nejakych
integritnich kontrol.
Jedine, ze bych se dostal do konfliktu s jinym uzivatelem na teze fakture.
Je to mozne?
Myslim, ze tomu lze zabranit, treba tak, ze uzavrit fakturu ma pravo pouze
jeden clovek.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Pavel Cisar

24. 9. 2002 11:54

Haj hou!

On 24 Sep 2002 at 7:38, ing. Jan Fiala wrote:

> Chce to třeba samostatnou tabulku, kde jsou cisla.
> V ramci transakce pri zapisu dokladu pridelis cislo, navysis jej v
> tabulce a commitnes cely zapis dokladu.
> Je treba dbat na spravnou uroven transakce.

Docela hruza z pohledu prace vice uzivatelu. Propustnost bude nula nula
nic.
 
> V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
> tak pouze informativne.

To nelze vzdy dodrzet.

Neprerusovanou radu lze realizovat i vlastnim sdilenym TCP/IP serverem s
jednoduchou implementaci dvoufazoveho potvrzovaciho protokolu.

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Jaroslav Kohák

24. 9. 2002 7:12

Nejlepsi mas kdyz udelas generator:

CREATE GENERATOR GEN_Muj;
SET GENERATOR GEN_Muj TO 161

 a das do trigeru:

CREATE TRIGGER jmeno FOR tabulka BEFORE INSERT POSITION 0 AS
BEGIN
 NEW.TvojeID = gen_id(GEN_Muj,1);
END

Cau Jarda


-----Original Message-----
From: aldik@quick.cz [mailto:aldik@quick.cz]
Sent: Monday, September 23, 2002 8:52 PM
To: delphi-l@clexpert.cz
Subject: Neprerusena ciselna rada pro doklady v FB/IB


Nazdar kluci, jak na %subj% fci MAX samozrejme
znam....chci se ale zeptat na
rozumne reseni z hlediska duplicity zaznamu, jake
je riziko, kdyz pouziju
Gen_ID tak to je preci jen jina vec,mam dojem ze
max mohu pouzivat jen po
commit ze? Jake jsou dalsi rizika??


Dekuji moc za kazdou radu...

Ales Pavel
D6 Ent WXP
laik v profesionalnim kolotoci

Odpovedá: ing. Jan Fiala

24. 9. 2002 10:34

24.9.2002 Pavel Cisar:
>> Chce to třeba samostatnou tabulku, kde jsou cisla.
>> V ramci transakce pri zapisu dokladu pridelis cislo, navysis jej v
>> tabulce a commitnes cely zapis dokladu.
>> Je treba dbat na spravnou uroven transakce.

> Docela hruza z pohledu prace vice uzivatelu. Propustnost bude nula nula
> nic.

Z jakeho duvodu ?
Samozrejme predpokladam, ze nemam otevrenou transakci po celou dobu
porizovani dokladu (jak to mnozi delaji), ale predpokladam zpusob
prace, kdy je transakce zahajena az kdyz uzivatel potvrdi ulozeni
dokladu. A zapsani dokladu trva relativne chvilku.
Jake vidis problemy s propustnosti ?

>> V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
>> tak pouze informativne.

> To nelze vzdy dodrzet.

A jak pak vyresis to, kdyz uzivatel zacne editovat, ja mu priradim
cislo, mezitim zacne editovat nekdo jiny, dostane vyssi cislo, ten
prvni si to rozmysli a dira je na svete.
Uved priklad, kdy nemuzu priradit cislo az na konci.

> Neprerusovanou radu lze realizovat i vlastnim sdilenym TCP/IP serverem s
> jednoduchou implementaci dvoufazoveho potvrzovaciho protokolu.

Ale to mas porad to same. Co v prechodu mesice, kdy nastane pripad,
ktery jsem posal predtim ? Pak se novy doklad v dalsim mesici zapise
do te diry.

--
Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Hlas

24. 9. 2002 9:52


----- Original Message -----
From: "ing. Jan Fiala" <jan.fiala@iol.cz>
> V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
> tak pouze informativne.
>

ako sa to da urobit - nepridelovat cislo pred zaciatkom editacie, ked pocas
editacie chcem udrzat vazbu
master detail a prim. kluc je zaroven kodom tejto vazby?


----------
Teraz si uz KAZDY moze registrovat svoju domenu .SK
Viac info na: http://www.SlovakNET.sk/predregistracia.asp

Odpovedá: Kalhous Zdenek

24. 9. 2002 9:37

On 24 Sep 2002 at 8:13, Jaroslav Kohák wrote:
> Nejlepsi mas kdyz udelas generator:
> CREATE GENERATOR GEN_Muj;
> SET GENERATOR GEN_Muj TO 161
> a das do trigeru:
> CREATE TRIGGER jmeno FOR tabulka BEFORE INSERT POSITION 0 AS
> BEGIN
> NEW.TvojeID = gen_id(GEN_Muj,1);
> END
Gott der Gerechte, tohle byste snad nemel pro generovani
NEPRETRZITE ciselne rady radit ani z legrace a ani nejvetsimu
nepriteli. Generatory se posouvaji nezavisle na transakci a tim
padem tam bude der jak v ementalu.

Odpovedá: Daniel Frantik

24. 9. 2002 9:39

> Nejlepsi mas kdyz udelas generator:
>
> CREATE GENERATOR GEN_Muj;
> SET GENERATOR GEN_Muj TO 161
>
> a das do trigeru:
>
> CREATE TRIGGER jmeno FOR tabulka BEFORE INSERT POSITION 0 AS
> BEGIN
> NEW.TvojeID = gen_id(GEN_Muj,1);
> END
A co kdyz to vypadne na chybu pri tom Insertu -> vznikne dira v
posloupnosti.
Generator rollbackem nevratis. Neznam moc IB, ale pochybuji, ze test na
integritu apod. dela jeste pred beforeinsert.
Pomohlo by AfterInsert, nebo ne? Co to udela, pokud je na ID constraint na
not null?

Danik
PS: opravdu me odpoved zajima, jelikoz to budu brzo asi resit  

Odpovedá: ing. Jan Fiala

24. 9. 2002 11:47

24.9.2002 Hlas:
> ako sa to da urobit - nepridelovat cislo pred zaciatkom editacie, ked pocas
> editacie chcem udrzat vazbu
> master detail a prim. kluc je zaroven kodom tejto vazby?

A jaky je problem si tam to cislo po editaci dodat ? proste doedituji
a nez to zapisu do tabulek, reknu si o cislo dokladu, a to tam
doplnim.
K cemu je potrebujes v prubehu editace ?
To snad editujes v GRIDu ? Pak s tim budes mit ve viceuzivatelskem
rezimu problemy. A pokud to neni sitova aplikace, nemusis se o ciselne
rady starat.

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Petr Fejfar

24. 9. 2002 17:40

From: "ing. Jan Fiala" <jan.fiala@iol.cz>

> Chce to třeba samostatnou tabulku, kde jsou cisla.
> V ramci transakce pri zapisu dokladu pridelis cislo, > navysis jej v
tabulce a commitnes cely zapis dokladu.
> Je treba dbat na spravnou uroven transakce.

Aby to mohlo fungovat v concurrent rezimu,
musi byt operace cteni+inkrementu neprerusitelna
jinym procesem.

Jak se to na SQL serveru implementuje?

* existuje nejaky SQL prikaz, ktery umi zaroven
  vratit hodnotu pole a inkrementovat ji v tabulce?

* nebo lze predepsat, aby se STORED PROC vykonala
  exclusivne?

* nebo existuji na urovni SQL nejaky prikazy pro
  implementaci kriticke sekce

* nebo ....?


thx, pf


Odpovedá: Jan Sebelík

24. 9. 2002 15:17

> > V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
> > tak pouze informativne.
> >
> ako sa to da urobit - nepridelovat cislo pred zaciatkom editacie, ked pocas
> editacie chcem udrzat vazbu
> master detail a prim. kluc je zaroven kodom tejto vazby?

Mas pravdu, prim. klic pri editaci potrebujes.
Mimo jine to znamena, ze se musis vzdat pozadavku na kontinualni casovou radu
id (treba kdyz uzivatel zmackne Cancel).

(Viz moje uvaha v paralelni zprave.)

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: ing. Jan Fiala

24. 9. 2002 11:37

24.9.2002 Petr Fejfar:
> From: "ing. Jan Fiala" <jan.fiala@iol.cz>
> Aby to mohlo fungovat v concurrent rezimu,
> musi byt operace cteni+inkrementu neprerusitelna
> jinym procesem.

> Jak se to na SQL serveru implementuje?

> * existuje nejaky SQL prikaz, ktery umi zaroven
> vratit hodnotu pole a inkrementovat ji v tabulce?

> * nebo lze predepsat, aby se STORED PROC vykonala
> exclusivne?

> * nebo existuji na urovni SQL nejaky prikazy pro
> implementaci kriticke sekce

> * nebo ....?


Nastavi se uroven transakce treba na
set transaction level serializable
To staci udelat na chvilku, nez nactes cislo a inkrementujes je.

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Jan Sebelík

24. 9. 2002 12:48

> Odesílatel: Daniel Frantik <frantik@telpro.cz>
> Pomohlo by AfterInsert, nebo ne? Co to udela, pokud je na ID constraint na
> not null?
Nepomohlo. After Insert uz nelze new.polozka menit.

Pokud se nemylim, probiha to nasledovne:
1. before insert
2. integritni kontroly
3. after insert

Podotykam, ze pokud after insert dojde k navaznym akcim na jinych tabulkach,
ktere skonci chybou, tak se provede celkovy rollback celeho insertu (i kdyz uz
jsem AFTER) vcetne vseho, co jsem udelal before insert. Tedy prave s vyjimkou
generatoru.

Abych se priznal, nedokazu pochopit, jak toto resil MSSQL, kdyz neznal
before/after a jak to resi ted.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Kalus Jozef Ing.

24. 9. 2002 14:20

a co takto si to po sebe skontrolovat a ak nie je rada celistva (je diera)
tak ju precislovat a poopravovat relacie - to by slo po kazdom inserte, je
to sproste riesenie ale islo by to aj tak... vzdy by vlastne stacilo
okontrolovat len n cisiel dozadu podla toho pokial to bolo uz okontrolovane
- to by sa niekde odlozilo.... neviem ci by som to takto nezmakol skor ako
nejake ine riesenie ... a to uz ani nehovorim o dakych transakciach a
podobne.... apropo nevsimol som si na akej baze to mas, niektore bazy
(ORACLE) maju db trigre pre insert, update, delete kde je nieco taketo mozne
strcit a skor ako to zapise alebo po zapise sa to moze usporiadat... a
podobne

joka

-----Original Message-----
From: ing. Jan Fiala [mailto:jan.fiala@iol.cz]
Sent: Tuesday, September 24, 2002 8:27 AM
To: delphi-l@clexpert.cz
Subject: Re: Neprerusena ciselna rada pro doklady v FB/IB


24.9.2002 Pavel Cisar:
>> Chce to třeba samostatnou tabulku, kde jsou cisla.
>> V ramci transakce pri zapisu dokladu pridelis cislo, navysis jej v
>> tabulce a commitnes cely zapis dokladu.
>> Je treba dbat na spravnou uroven transakce.

> Docela hruza z pohledu prace vice uzivatelu. Propustnost bude nula nula
> nic.

Z jakeho duvodu ?
Samozrejme predpokladam, ze nemam otevrenou transakci po celou dobu
porizovani dokladu (jak to mnozi delaji), ale predpokladam zpusob
prace, kdy je transakce zahajena az kdyz uzivatel potvrdi ulozeni
dokladu. A zapsani dokladu trva relativne chvilku.
Jake vidis problemy s propustnosti ?

>> V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
>> tak pouze informativne.

> To nelze vzdy dodrzet.

Odpovedá: Petr Fejfar

24. 9. 2002 15:56

From: "ing. Jan Fiala" <jan.fiala@iol.cz>

> Nastavi se uroven transakce treba na
> set transaction level serializable
> To staci udelat na chvilku, nez nactes cislo a inkrementujes je.

Aha, ale pokud mne pamet neklame, tak jsem si teto moznosti u SQL serveru
nevsiml (ale nepotreboval jsem,tak nevim). Da se predpokladat, ze podobnou
vlastnost na urovni transakce ma vetsina SQL server u PC platforme?

Thx, pf

Odpovedá: Erik Salaj

25. 9. 2002 8:17

>> Chce to třeba samostatnou tabulku, kde jsou cisla.
>> V ramci transakce pri zapisu dokladu pridelis cislo, navysis jej v
>> tabulce a commitnes cely zapis dokladu.
>> Je treba dbat na spravnou uroven transakce.
>
>Docela hruza z pohledu prace vice uzivatelu. Propustnost bude nula nula
>nic.

podla mna to je jedno z najrozumnejsich a zaroven univerzalnych rieseni,
t.j. tabulka s pocitadlami, kde je mozne nastavit (a ak je to potrebne
i zmenit) hodnotu pocitadla a pripadne i hodnotu inkrementacie
(zase ak by to bolo potrebne). Kazde pocitadlo moze byt v zvlastnom
zazname, cize uzivatelia roznych tabuliek nie su vzajomne blokovani.

>> V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
>> tak pouze informativne.
>
>To nelze vzdy dodrzet.

preco nie? Master-detail relacia by aj tak nemala byt naviazana na
nejake cislo dokladu ale na ID zaznamu. A ci viem cislo dokladu
pocas alebo az po editacii (teda o 5 minut skor alebo neskor)
je podla mna uplne jedno.

>Neprerusovanou radu lze realizovat i vlastnim sdilenym TCP/IP serverem s
>jednoduchou implementaci dvoufazoveho potvrzovaciho protokolu.

zbytocne komplikovane a este k tomu low-level riesenie

Erik

Odpovedá: Blazek Jaroslav

24. 9. 2002 14:08

Ahoj,

> honza@haes.cz 24.9.02 12:37 >>>
>Abych se priznal, nedokazu pochopit, jak toto resil MSSQL, kdyz neznal
before/after a jak to resi ted.

na MSSQL to muze byt treba takto...neznam moc FB/IB, ale mozna neco pujde
pouzit i tam

CREATE TABLE Tabulka
(
 IdTabulka INT PRIMARY KEY IDENTITY,
 Cislo INT NOT NULL UNIQUE,
 Info VARCHAR(50),
 Smazano BIT DEFAULT 0
)

INSERT INTO Tabulka (Cislo, Info)
 (
SELECT CASE WHEN AktMinimum > 1 THEN 1 ELSE PoruseneMinimum END NoveCislo,
'text' FROM
(SELECT ISNULL(MIN(Cislo),0) AS AktMinimum FROM Tabulka ) t1,
(SELECT ISNULL(MIN(Cislo),0) + 1 AS PoruseneMinimum FROM Tabulka t
 WHERE NOT EXISTS (SELECT * FROM Tabulka WHERE Cislo = t.Cislo + 1)) t2
)

nebo neco podobneho jde pouzit i v triggeru


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Jan Fiala [work]

24. 9. 2002 17:45

ja to delal tak, ze na sloupci nastavis NOT NULL.
pri vyplnovani nabidnes treba MAX(cislo) + 1
pri ukladani to prdnes to transakce a pokud to padne na neunikatni cislo,
tak ho povysis a opakujes transakci do te doby, nez to projde. Samozrejme by
bylo vhodne uzivatele informovat o zmene cisla, ktere bylo nabidnuto ve
formulari.

Preji Hezký den
Jan Fiala
_________________________________________
fiala@kvasar.cz
http://www.kvasar.cz
tel.:067/7212800
mob.:0608724278
ICQ: 22070733
_________________________________________



-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
Behalf Of Blazek Jaroslav
Sent: Tuesday, September 24, 2002 3:04 PM
To: delphi-l@clexpert.cz
Subject: Re: Neprerusena ciselna rada pro doklady v FB/IB


Ahoj,

> honza@haes.cz 24.9.02 12:37 >>>
>Abych se priznal, nedokazu pochopit, jak toto resil MSSQL, kdyz neznal
before/after a jak to resi ted.

na MSSQL to muze byt treba takto...neznam moc FB/IB, ale mozna neco pujde
pouzit i tam

CREATE TABLE Tabulka
(
 IdTabulka INT PRIMARY KEY IDENTITY,
 Cislo INT NOT NULL UNIQUE,
 Info VARCHAR(50),
 Smazano BIT DEFAULT 0
)

INSERT INTO Tabulka (Cislo, Info)
 (
SELECT CASE WHEN AktMinimum > 1 THEN 1 ELSE PoruseneMinimum END NoveCislo,
'text' FROM
(SELECT ISNULL(MIN(Cislo),0) AS AktMinimum FROM Tabulka ) t1,
(SELECT ISNULL(MIN(Cislo),0) + 1 AS PoruseneMinimum FROM Tabulka t
 WHERE NOT EXISTS (SELECT * FROM Tabulka WHERE Cislo = t.Cislo + 1)) t2
)

nebo neco podobneho jde pouzit i v triggeru


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Hlas

24. 9. 2002 14:32

needitujem v gride, edituje v dbeditoch. editujem naraz aj master aj detail
tabulku
a aby to pocas editacie normalne vyzeralo, aby uzivatel videl ako mu
pribudaju zaznamy
do detailu, a aby sa mohol na zaver rozhodnut ci to cele chce ulozit alebo
nie
tak potrebujem hodnotu v poliach (primarny kluc v mastrovi a cudzi kluc v
detaile).
jednoducho ak tam tieto hodnoty nie su, tak to pisti hlaskami, co je uplne
logicke.

inak trochu to je o inom ako znie subject mailu, lebo ja vlastne nevyzadujem
neprerusenu
radu - primarny kluc je schovany a uzivatel ho nevidi, takze su tam diery,
pri takomto
postupe vznikaju diery ak uzivatel urobi append a cancel.
neulozi zaznam, ale mne IB generator zvisi hodnotu o 1 lebo si ho pytam
pri udalosti komponenty IBQuery.before insert.
inak takto to robia aj vzorove prikladi v delphi-demos
mastapp, ibmastapp a toto je odporucane aj v knihe myslime v jazyku D6
od marca cantu. takto som to mal vyriesene
v bde aplikacia, kde sa to osvedcilo. neviem to vymysliet lepsie.

----- Original Message -----
From: "ing. Jan Fiala" <jan.fiala@iol.cz>
To: <delphi-l@clexpert.cz>
Sent: Tuesday, September 24, 2002 11:51 AM
Subject: Re: Neprerusena ciselna rada pro doklady v FB/IB


> 24.9.2002 Hlas:
> > ako sa to da urobit - nepridelovat cislo pred zaciatkom editacie, ked
pocas
> > editacie chcem udrzat vazbu
> > master detail a prim. kluc je zaroven kodom tejto vazby?
>
> A jaky je problem si tam to cislo po editaci dodat ? proste doedituji
> a nez to zapisu do tabulek, reknu si o cislo dokladu, a to tam
> doplnim.
> K cemu je potrebujes v prubehu editace ?
> To snad editujes v GRIDu ? Pak s tim budes mit ve viceuzivatelskem
> rezimu problemy. A pokud to neni sitova aplikace, nemusis se o ciselne
> rady starat.
>
> --
> ing. Jan Fiala
> mailto:jan.fiala@iol.cz
>
>
>


----------
Teraz si uz KAZDY moze registrovat svoju domenu .SK
Viac info na: http://www.SlovakNET.sk/predregistracia.asp

Odpovedá: Jakub Martinek

24. 9. 2002 14:47

Neprerusena rada unikatnich cisel opravdu neni nijak trivialni ukol.
Spise je treba se zamyslet nad potrebnosti takove spojite rady.
Ciste reseni je pridelovat v okamzik zapisu. V tom pripade se urcite vyhnete
datove citlivym komponentam (DBGrid,DBEdit, ...).
Patricne ID pridelite v okamziku zapisu danych polozek (jinak to nebude
fungovat pro vice jak 1 uzivatele) a uzamknete jeho pridelovani do dokonceni
zapisu. Vazby vas nemusi do tohot okamziku zajimat, ty by mel vytvorit az
server na zaklade referencni integrity (stejne nema smysl napr. ukladat
radky faktury, nez ji jako takovou vytvorite).
Otazkou zustane, co budete delat, kdyz nekdo smaze jiz vytvoreny zaznam.
Pokud k tomu muze dojit, nema cenu se timto vubec zabyvat (prebudovavat
ciselnou radu pouzitou jako PK v cele databazi neni to nejlepsi).
ID je v tomto pripade lepsi generovat z nejake vasi vlastni polozky a pomoci
referencni integrity zajistit jeho in<-> de krenmentaci .

"Spinave" reseni je udrzovat seznam "der" a postupne je vyplnovat (pak tam
ale presto nejake mezery budou). - Funkcni a pomerne bezne pouzivane.

Radeji ale na souvislou neprerusovanou radu zapomente.

Jakub Martinek
jmartinek@vakmb.cz

>Aldik chape,ale reseni nejako nevidi:
>No fajn....
>A jake mas reseni? Nejaky navod na netu a jine prakticke rady?

zdenek kalhous:
>>Pridelovani unikatnich cisel v neprerusene rade neni tak trivialni jak
>>se na prvni pohled zda, riziko pouzivani max pro tento ucel je krome
>>jineho v tom, ze ve viceuzivatelskem a trochu intenzivnim provozu
>>ma prakticky nulovou sanci na fungovani. Zkuste si jen tak na papire
>>nasimulovat jak se to bude chovat.

Odpovedá: Pavel Cisar

24. 9. 2002 17:32

Haj hou!

Velmi dobry clanek na toto tema je zde:

http://www.ibobjects.com/docs/ti_AuditableSeries.ZIP

V aglictine.

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Pavel Cisar

24. 9. 2002 19:55

Haj hou!

On 24 Sep 2002 at 8:27, ing. Jan Fiala wrote:

> 24.9.2002 Pavel Cisar:
>
> > Docela hruza z pohledu prace vice uzivatelu. Propustnost bude nula nula
> > nic.
>
> Z jakeho duvodu ?
> Samozrejme predpokladam, ze nemam otevrenou transakci po celou dobu
> porizovani dokladu (jak to mnozi delaji), ale predpokladam zpusob
> prace, kdy je transakce zahajena az kdyz uzivatel potvrdi ulozeni
> dokladu. A zapsani dokladu trva relativne chvilku.
> Jake vidis problemy s propustnosti ?

Aktualizace tehoz radku tabulky (uchovava posledni cislo pro tabulku) z
mnoha transakci. Budou se navzajem blokovat. Nemluve o mnozeni verzi
tohoto radku. Zkus insertovat 10000 dokladu davkove z programu a jen tyto
verze te u IB udusi, protoze sweep thread ma mensi prioritu a nedostane
se k lizu.
 
> >> V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
> >> tak pouze informativne.
>
> > To nelze vzdy dodrzet.
>
> A jak pak vyresis to, kdyz uzivatel zacne editovat, ja mu priradim
> cislo, mezitim zacne editovat nekdo jiny, dostane vyssi cislo, ten
> prvni si to rozmysli a dira je na svete.
> Uved priklad, kdy nemuzu priradit cislo az na konci.

Master-detail ala doklad. Uklada se najednou v jedine transakci. Pri
insertu slave radku musis uz znat PK mastera.

> > Neprerusovanou radu lze realizovat i vlastnim sdilenym TCP/IP serverem s
> > jednoduchou implementaci dvoufazoveho potvrzovaciho protokolu.
>
> Ale to mas porad to same. Co v prechodu mesice, kdy nastane pripad,
> ktery jsem posal predtim ? Pak se novy doklad v dalsim mesici zapise
> do te diry.

Nemas. Da se to logisticky zvladnout i stakovymto uzkym hrdlem. Bohuzel
idealni reseni asi neexistuje.

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Pavel Cisar

25. 9. 2002 7:14

Haj hou!

On 25 Sep 2002 at 13:30, Ales Pavel wrote:

> >Neprerusovanou radu lze realizovat i vlastnim sdilenym TCP/IP serverem s
> >jednoduchou implementaci dvoufazoveho potvrzovaciho protokolu.
>
> Vubec nechapu o cem mluvis  Nemel bys ukazku....

Sorry, na takove veci nemam cas   Ale urcite najdes inspiraci v
prikladech INDY komponent. Nemasli D6 nebo D7, pak jsou k mani zdarma
(open source) na www.nevrona.com

Snad jen par poznamek k tomu, co by to melo delat:

Pro pridelovani cisla neni vubec potreba databaze Zajisteni neprerusovane
rady a perzistenci zmen (poslendi cislo) lze velmi snadno naprogramovat
primo v serveru cisel. Pridelovani z paralelnich pozadavku lze pak snadno
synchronizovat pomoci kriticke sekce. Male, rychle, efektivni. Pokud
aplikace nebude udrzovat trvale spojeni se serverem, ale vytvaret je vzdy
jen po dobu generovani cisla, lze tak efektivne obsluhovat i velky pocet
klientu (>2000) najednou, jinak muze byt i trvale spojeni.

Problemem stale zustava skutecne pouziti jednou prideleneho cisla. To lze
zajistit implementaci jednoducheho dvoufazoveho potvrzovani v aplikaci a
serveru cisel. Cisla se musi potvrdit po uspesnem commitu, jinak je
server cisel po zvolenem casovem limitu bude povazovat za nepouzita a
znovu prideli. To by slo realizovat nejlepe primo jako soucast serveru
cisel, ktera by prijimala udalosti (events) z databaze o pridelenych
cislech (viz komponent IBEvents a priklad v Delphi). V triggeru after
insert na tabulce by se *vlozil* novy zaznam do logovaci tabulky s
cislem, a vyvolal event. Ten je rozeslan az pri commitu. Server by prijal
event a precetl si cisla z tabulky (v jedine transakci typu snapshot, ne
read committed), "potvrdil" si je zaznamy smazal. V pripade, ze dojde k
preruseni komunikace se serverem cisel a aplikaci/databazi, jsou
skutecne pouzita, ale nepotvrzena cisla stale ulozena v logovaci tabulce,
a daji se potvrdit pozdeji. V takovem pripade doporucuji, aby server
cisel neuvolnoval nepotvrzena cisla automaticky k novemu pouziti, ale aby
vyzadoval rucni vyreseni (dodatecne rucni potvrzeni, uvolneni k
opetovnemu pouziti).

> Ales Frantisek Pavel
> (Info pro neznalce: 2 jmena mivaji SVATIII,Papez - no a ja mam 3 dokonce
> uredne dolozitelne  )

 A reci jak Palacky  

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Pavel Cisar

25. 9. 2002 8:12

Haj hou!

On 24 Sep 2002 at 14:39, Petr Fejfar wrote:

> From: "ing. Jan Fiala" <jan.fiala@iol.cz>
>
> > Nastavi se uroven transakce treba na
> > set transaction level serializable
> > To staci udelat na chvilku, nez nactes cislo a inkrementujes je.
>
> Aha, ale pokud mne pamet neklame, tak jsem si teto moznosti u SQL serveru
> nevsiml (ale nepotreboval jsem,tak nevim). Da se predpokladat, ze podobnou
> vlastnost na urovni transakce ma vetsina SQL server u PC platforme?

Zpatky do skoly   Izolacni urovne jsou uhelnym kamenem vsech C/S SQL
databazi od sereho davnoveku (a soucast SQL standardu). Omluvou je pouze
pouzivani BDE, ktere cloveku existenci nejakych izolacnich urovni
transakce zataji (kdyz uz o jine nez defaultni mapovani nekdo stoji, tak
se to resi magickymi cisly ve Vendor flags položce a plati pro cely
alias).

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: ing. Jan Fiala

25. 9. 2002 7:13

24.9.2002 Pavel Cisar:
> Haj hou!

> On 24 Sep 2002 at 8:27, ing. Jan Fiala wrote:

>> 24.9.2002 Pavel Cisar:
>>
>> > Docela hruza z pohledu prace vice uzivatelu. Propustnost bude nula nula
>> > nic.
>>
>> Z jakeho duvodu ?
>> Samozrejme predpokladam, ze nemam otevrenou transakci po celou dobu
>> porizovani dokladu (jak to mnozi delaji), ale predpokladam zpusob
>> prace, kdy je transakce zahajena az kdyz uzivatel potvrdi ulozeni
>> dokladu. A zapsani dokladu trva relativne chvilku.
>> Jake vidis problemy s propustnosti ?

> Aktualizace tehoz radku tabulky (uchovava posledni cislo pro tabulku) z
> mnoha transakci. Budou se navzajem blokovat. Nemluve o mnozeni verzi
> tohoto radku. Zkus insertovat 10000 dokladu davkove z programu a jen tyto
> verze te u IB udusi, protoze sweep thread ma mensi prioritu a nedostane
> se k lizu.
 
Ja jsem psal o MSSQL, ten si verze nemnozi. Mozna mi unikl zacatek,
kdy se to rozvinulo nad IB.

Kolik uzivatelu ti ve stejnem okamziku klikne na zapsani dokladu ?
Blokovani je jen v tomto okamziku. A to se urcite netyka 10000 dokladu
denne. Stejny druh dokladu dela max. par lidi.
A pokud uvazujes o 10000 dokladech, co rikas na nazory, kdy by se s
takovym systemem pracovalo v DB editech, gridech apod., jak popisovali
reseni ostatni.

--
ing. Jan Fiala
mailto:jan.fiala@iol.cz

Odpovedá: Ludek Paral

25. 9. 2002 9:30

Ja to delam zvlastni promennou, kterou mam ulozenou.

Pak mam na query udelany event BeforeInsert, kde
1. zjistim Prvni cislo dle nastaveni
2. Zjistim, zda existuje ucet PrvniCislo-1
    Ano - vse OK
    Ne - upozorneni uzivatele o prerusene ciselne rade (at se sdam rozhodne,
co s tim)

Pokud existuje vice uzivatelu, kteri by soucasne vytvareli ucty, tak by
mozna bylo nejlepsi urcovat prvni cislo az pred tiskem (tj. po teto akci
jiz nelze ucet smazat, pouze oznacit doklad jako stornovany)

Ludek Paral

Odpovedá: Petr Fejfar

25. 9. 2002 7:38

From: "Pavel Cisar" <pcisar@users.sourceforge.net>

> > > Nastavi se uroven transakce treba na
> > > set transaction level serializable
> > > To staci udelat na chvilku, nez nactes cislo a inkrementujes je.
> >
> > Aha, ale pokud mne pamet neklame, tak jsem si teto moznosti u SQL
serveru
> > nevsiml (ale nepotreboval jsem,tak nevim). Da se predpokladat, ze
podobnou
> > vlastnost na urovni transakce ma vetsina SQL server u PC platforme?


> Zpatky do skoly   Izolacni urovne jsou uhelnym kamenem vsech C/S SQL

Ne ze by se clovek nemusel cely zivot ucit, ale obavam se ,
ze Tvoje odpoved je poneku mimo misu  

Nebo si ji mam vylozit tak, ze existuje u IB/FB, DB/2 ci dalsich SQL stroju
transaction isolation level serializable a tudiz moznost zamknout SQL stroj?

Ja jsem spis nabyl dojmu, ze tato uroven neni nijak obvykla, spise bych
rekl, ze je specificicka pro M$ SQL - to bych si chtel mj. ujasnit.

Dale me zajima, jak se da zajistit neprerusitelnost vykonani operaci
GET&INC, pokud si budes generovat hodnotu sam na urovni SQL prikazu a nemas
isolation level "serializable" (ci nejakou rovnocennou) resp. zda existuji
nejake standardni "high-level" postupy, jak takovou vec implementovat
prostrednictvim SQL prikazu.


Bye, pf


Odpovedá: Jonás Marian

25. 9. 2002 7:30

> Nebo si ji mam vylozit tak, ze existuje u IB/FB, DB/2 ci
> dalsich SQL stroju
> transaction isolation level serializable a tudiz moznost
> zamknout SQL stroj?
>
> Ja jsem spis nabyl dojmu, ze tato uroven neni nijak obvykla,
> spise bych
> rekl, ze je specificicka pro M$ SQL - to bych si chtel mj. ujasnit.
>
> Dale me zajima, jak se da zajistit neprerusitelnost vykonani operaci
> GET&INC, pokud si budes generovat hodnotu sam na urovni SQL
> prikazu a nemas
> isolation level "serializable" (ci nejakou rovnocennou) resp.
> zda existuji
> nejake standardni "high-level" postupy, jak takovou vec implementovat
> prostrednictvim SQL prikazu.
>
> Bye, pf

SQL92 definuje tyto standartni urovne izolaci :
1. Read Uncommitted
2. Read Committed
3. Repeatable Read
4. Serializable

ale v pripade zminovane DB2 si IBM prejmenovala urovne na :
1. Uncommitted read (UR)
2. Cursor stability (CS)
3. Read Stability (RS)
4. Repeatable read (RR)
a v DB2 pro AS/400 pridala jeste No commit (NC)

Marian Jonas

Odpovedá: Pavel Cisar

25. 9. 2002 7:33

Haj hou!

On 24 Sep 2002 at 23:46, Petr Fejfar wrote:

> Nebo si ji mam vylozit tak, ze existuje u IB/FB, DB/2 ci dalsich SQL stroju
> transaction isolation level serializable a tudiz moznost zamknout SQL stroj?

Ano, existuje. Nazyva se sice vetsinou u kazdeho systemu jinak, ale
existuje. U InterBase/Firebirdu se jmenuje SNAPSHOT TABLE STABULITY, ale
stejneho efektu by slo dosahnout i doplnujicim RESERVING u prosteho
SNAPSHOT.
 
> Ja jsem spis nabyl dojmu, ze tato uroven neni nijak obvykla, spise bych
> rekl, ze je specificicka pro M$ SQL - to bych si chtel mj. ujasnit.

Bohuzel, neni to specialita MS.

> Dale me zajima, jak se da zajistit neprerusitelnost vykonani operaci
> GET&INC, pokud si budes generovat hodnotu sam na urovni SQL prikazu a nemas
> isolation level "serializable" (ci nejakou rovnocennou) resp. zda existuji
> nejake standardni "high-level" postupy, jak takovou vec implementovat
> prostrednictvim SQL prikazu.

Od toho je prave ten serializable isolation level   Nedovedu si
predstavit (i kdyz mozna existuje) jak to resit jinak s concurrency
isolation levelem. Jedine snad s pomoci UDF mimo kontrolu serveru.

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Pavel Cisar

25. 9. 2002 15:58

Haj hou!

On 24 Sep 2002 at 21:31, ing. Jan Fiala wrote:

> Ja jsem psal o MSSQL, ten si verze nemnozi. Mozna mi unikl zacatek,
> kdy se to rozvinulo nad IB.

Yup, IB je na tom v tomto pripade o neco hure.
 
> Kolik uzivatelu ti ve stejnem okamziku klikne na zapsani dokladu ?
> Blokovani je jen v tomto okamziku. A to se urcite netyka 10000 dokladu
> denne. Stejny druh dokladu dela max. par lidi.
> A pokud uvazujes o 10000 dokladech, co rikas na nazory, kdy by se s
> takovym systemem pracovalo v DB editech, gridech apod., jak popisovali
> reseni ostatni.

Ano, je pravda, ze auditovane serie nejsou treba vsude, a ze
pravdepodobnost soubehu uzivatelu je nizka. Jenze ja mam v cerstve pameti
pozadavek co jsem resil pred dvema dny na auditovane serie u dat se
soubeznym pristupem 5000 uzivatelu (nazivo a soucasne), takze jsem jeste
ovlivnen. Ale uznavam, ze to asi neni tento pripad  

S pozdravem
Pavel Cisar
Mobil: 0724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Lstiburek Pavel

25. 9. 2002 15:33

Myslim si, ze "cislo dokladu" nepotrebuje, pouze je potreba dodrzet starou
poucku, ze PK nemaji byt vypovidajici identifikatory, ale jen
"identifikatory".

Tedy:
-----
1. "cislo dokladu" ucin samostatnym sloupcem v "dokladu" a pouhym jedinecnym
klicem (pouze pro jistotu).
2. Vazbu master-detail realizuj pres PK ktery budes generovat libovolnym
zpusobem (v IB je nejjednodusi generator).
3. Needituj primo nad tabulkami, ale nekam si to natlac a pak to zapis vse
najednou, pekne v transakci, vcetne zvyseni cisla dokladu o 1.

Tento postup je "lety" provereny, nebot prani, i co se formatu cisel dokladu
tyka, uzivatelu jsou preletava jak letni lasky.
Ono transakcovani pri prime editaci v SQL serveru vede nejcasteji do pekel
(zvlaste operaci insert si dabel pochvaluje).
Bohuzel to neresi oblibeny problem, doklad je "zrusen", pokud to neni
posledni a cislo se chytre generuje ve tvaru rokmesicporadovecislodokladu a
dalsi doklad prijde az v nasledujicim obdobi (, ale to je vesmes dano
idiocii metodickych predpisu a metodiku).

Pavel

> Od: Jan Sebelík [mailto:honza@haes.cz]

> > > V zadnem pripade cisla neprideluj pri zacatku editace
> dokladu a kdyz,
> > > tak pouze informativne.
> > >
> > ako sa to da urobit - nepridelovat cislo pred zaciatkom
> editacie, ked pocas
> > editacie chcem udrzat vazbu
> > master detail a prim. kluc je zaroven kodom tejto vazby?
>
> Mas pravdu, prim. klic pri editaci potrebujes.
> Mimo jine to znamena, ze se musis vzdat pozadavku na
> kontinualni casovou radu id (treba kdyz uzivatel zmackne Cancel).
>
> (Viz moje uvaha v paralelni zprave.)

Odpovedá: Ales Pavel

24. 9. 2002 14:42

Aldik chape,ale reseni nejako nevidi:
No fajn....
A jake mas reseni? Nejaky navod na netu a jine prakticke rady?

zdenek kalhous:
>Pridelovani unikatnich cisel v neprerusene rade neni tak trivialni jak
>se na prvni pohled zda, riziko pouzivani max pro tento ucel je krome
>jineho v tom, ze ve viceuzivatelskem a trochu intenzivnim provozu
>ma prakticky nulovou sanci na fungovani. Zkuste si jen tak na papire
>nasimulovat jak se to bude chovat.

Odpovedá: Ales Pavel

24. 9. 2002 15:03

Parada to je to potrebuji.......diky moc....

Nejlepsi mas kdyz udelas generator:

CREATE GENERATOR GEN_Muj;
SET GENERATOR GEN_Muj TO 161

 a das do trigeru:

CREATE TRIGGER jmeno FOR tabulka BEFORE INSERT POSITION 0 AS
BEGIN
 NEW.TvojeID = gen_id(GEN_Muj,1);
END

Cau Jarda


Odpovedá: Ales Pavel

24. 9. 2002 15:58


Pavka Cisar radi a Alda nechape:
>Neprerusovanou radu lze realizovat i vlastnim sdilenym TCP/IP serverem s
>jednoduchou implementaci dvoufazoveho potvrzovaciho protokolu.


Aldik vrasti celo a bije se v prsa 

Nuze po tvem Pavko HAJ HOU 
Nuzes mi to rici trochu vice jako pro blba,ke kteremu kdyz sleduji tvoji
odpoved dusevne priklanim  Vubec nechapu o cem mluvis:-)
Nemel bys ukazku....
Asi tusim co myslis....ale detail mi unika diky malym znalostem teto
problematiky (tcp/ip server jsem si jeste veru nedelal...)...
Muzes si ty nebo jiny databazovy vymytac vyjadrit podrobneji ci prihodit
nejake link?

Bye Bye

Ales Frantisek Pavel
(Info pro neznalce: 2 jmena mivaji SVATIII,Papez - no a ja mam 3 dokonce
uredne dolozitelne  )
D6 Ent WXP
laik v profesionalnim kolotoci

Odpovedá: Ludek ZITA

1. 10. 2002 13:30


----- Original Message -----
From: "Jan Sebelík" <honza@haes.cz>


> > > V zadnem pripade cisla neprideluj pri zacatku editace dokladu a kdyz,
> > > tak pouze informativne.
> > >

> > ako sa to da urobit - nepridelovat cislo pred zaciatkom editacie, ked
pocas
> > editacie chcem udrzat vazbu
> > master detail a prim. kluc je zaroven kodom tejto vazby?

> Mas pravdu, prim. klic pri editaci potrebujes.
> Mimo jine to znamena, ze se musis vzdat pozadavku na kontinualni casovou
radu id (treba kdyz uzivatel zmackne Cancel).

Ahoj.
Ctu to trochu se spozdenim ale na tohle se neda nereagovat.
Pouzivat cislo faktury jako primarni klic je, myslim mimoradna hloupost.
Jako primarni klic je vhodne pouzivat vzdy bezvyznamovou polozku, nejlepe
identity nebo GUID.
Pouzitim obsahove vyznamneho pole jako PK si jiz pri navrhu databaŸe
zadelavate na tezke problemy.
Sam jsem se jiz takhle pekne spalil.

Ludek


Odpovedá: Roland Turcan

25. 9. 2002 7:50

My sme si tento problem riesili pomocou tabulkou ktora obsahuje:
Create CisRada(ID integer,Cislo integer,uzivatel varchar(30),pridelene
smallint);

1. zaisti si tabulku CisRada aby zaznam ktory si vytvoril nikto
nemohol update, delete
(myslim ze nieco v before update a delete ako if(old.uzivatel<>current_user)
then exception...
)
2. zisti najmensie nepridelene cislo
3. zapis do tabulky s vrat ho ako result value SP
3a. if HasError(step3) opakuj step2; (asi ti to cislo niekto vyfukol)


Nevyhoda: nie je mozne byt pripojeny ako jeden user_name pre celu
siet, tak ako to niektory robia.

--
Best regards, TRoland
http://www.rotursoft.sk